DOI

Appendix 1. Stimuli list

Table 1. Stimuli list

Transcription Andi script Translation (Rus) Translation (Eng)
ʁadillˀa=lo гъадилл*а=ло ‘в загоне, тоже’ ‘in a shed, too’
χajrulˀa=ʁojd хайрул*а=гъойд ‘на выручке, мол’ ‘on a revenue, they say’
aχirulˀa ахирул*а ‘в конце’ ‘in the end’
aχranɬo=lojd ахранлъо=лойд ‘сторожем’ ‘as a gatekeeper, PTCL’
alamatol аламатол ‘чудеса’ ‘miracles’
ašolawl ашолавл ‘ашалинцы’ ‘Ashali villagers’
balˀib бал*иб ‘ученый’ ‘educated’
balˀoɬi бал*олъи ‘обучил’ ‘taught (them)’
balˀorallo бал*оралло ‘обучает’ ‘teaches (them)’
belˀora бел*ора ‘тонкий’ ‘thin’
beqoloɢa бехъологъ*а ‘пока прибудет’ ‘until (someone) arrives’
beqoloɢasːi бехъологъ*асси ‘пока прибудет’ ‘until (someone) arrives’
beršo=lˀa бершол*а ‘поменялось’ ‘(it) changed’
bik’o=lˀa бикIо=л*а ‘было же’ ‘(it) was, wasn’t it’
bik’o=sːu=lˀa бикIо=ссу=л*а ‘не было же’ ‘(it) was not, was it’
biloɬol билолъол ‘горцы’ ‘highlanders’
biloč’ukːu билочIукку ‘с горы’ ‘from a mountain’
bilolˀakːu билол*акку ‘с гор’ ‘from the mountains’
bilolˀakːu=χarid билол*акку=харид ‘со стороны гор’ ‘from the direction of the mountains’
bilolˀo=jd билол*о=йд ‘в горы, мол’ ‘into the mountains, they said’
buʁa=lo бугъа=ло ‘бычок, тоже’ ‘young bull, too’
buχːurado=lo буххурадо=ло ‘забирают, тоже’ ‘taking it, too’
bulˀonoq бул*онохъ ‘ушло’ ‘(it) left’
buturulur бутурулур ‘чеченцев (род.п.)’ ‘of the Chechens’
c’alˀa цIал*а ‘на огне’ ‘on fire’
č’alanni=lo чIаланни=ло ‘надоело, тоже’ ‘got fed up, too’
č’itulˀo чIитул*о ‘в местность Читу’ ‘to Chitu (toponym)’
čalu=lo чалу=ло ‘фитиль, тоже’ ‘candle wick, too’
čalu=lojd чалу=лойд ‘фитиль’ ‘candle wick, PTCL’
ček’a=lo чекIа=ло ‘нога, тоже’ ‘leg, too’
čelekʷaq челеквахъ ‘в ведра’ ‘in the buckets’
čelek=lojd челек=лойд ‘ведро’ ‘bucket, PTCL’
čongola чонгола ‘в тазике’ ‘in a wash-basin’
čʷaχːelasːi чваххеласси ‘протекающий’ ‘one that leaks’
darʁilˀa даргъил*а ‘в местности Дарго’ ‘in Dargo (toponym)’
darʁilˀo даргъил*о ‘в местность Дарго’ ‘to Dargo (toponym)’
dilˀo дил*о ‘мне’ ‘to me’
gallˀa=lojd галл*а=лойд ‘на шее’ ‘on shoulder, PTCL’
haǯilawšud гьаджилавшуд ‘Гаджилав (эргатив)’ ‘Gadzhilav (personal name, ergative)’
haq’illˀa=lo гьакъилл*а=ло ‘по поводу, тоже’ ‘and as to …’
haq’iq’atilˀa гьакъикъатил*а ‘на самом деле’ ‘in truth, truly’
haržulˀa гьаржул*а ‘на сундуке’ ‘on a trunk’
hawroχilˀa гьаврохил*а ‘на ишаке’ ‘on a donkey’
heɬeliɬ гьелъелилъ ‘их (жен. р. мн. ч.)’ ‘their (women’s)’
heɬulo гьелъу=ло ‘там, тоже’ ‘there, too’
hebrihilˀa=jd гьебригьил*а=йд ‘в это время, мол’ ‘at that moment, they said’
hegebrihi=lo гьегебригьи=ло ‘это время, тоже’ ‘that moment, too’
hegelˀa гьегел*а ‘на этом’ ‘on this’
hegelid гьегелид ‘они (жен. р. мн. ч. эрг.)’ ‘they (women, ergative)’
hegeluɬu гьегелулъу ‘им (муж. р. мн. ч.)’ ‘to them (men)’
helč’u=lo гьелчIу=ло ‘у этого, тоже’ ‘at him, too’
hilˀa гьил*а ‘наверху’ ‘on top of’
hilˀasːi гьил*асси ‘верхний’ ‘that of the top’
hilˀo гьил*о ‘наверх’ ‘onto the top of’
hilˀolč’i=lo гьил*олчIи=ло ‘еще больше’ ‘even more’
hinc’olˀa гьинцIол*а ‘на камне’ ‘on a stone’
hinu=lo гьину=ло ‘внутри, тоже’ ‘inside, too’
hinulogusːi гьинулогусси ’с внутренним‘ ’with that from inside‘
hoɢollˀo=lojd гьогъолло=лойд ‘на землю’ ‘onto the ground, PTCL’
horsatilˀa гьорсатил*а ‘сейчас’ ‘at this time, now’
huda=lojd гьуда=лойд ‘туда’ ‘there, PTCL’
huga=lo гьуга=ло ‘туда, тоже’ ‘to there, too’
iʟu=lojd илIу=лойд ‘внутрь’ ‘inside, PTCL’
iχʷalˀaʁojd ихвал*агъойд ‘в местности Ихвойл’ ‘in Ikhvoyl (toponym)’
iχolˀa ихол*а ‘на мельнице’ ‘at a mill’
ila ила ‘мать’ ‘mother’
ilajma илайма ‘родители’ ‘parents’
ilajmalɬbo=lo илаймаллъбо=ло ‘родители, тоже (аффектив)’ ‘parents, too (affective)’
iluʟ илулъ ‘матери (генитив)’ ‘mother’s’
innagulo иннагуло ‘постоянно’ ‘constantly’
išːalo ищало ‘домой’ ‘to home’
išulo ишуло ‘дома’ ‘at home’
iwalo ивало ‘куда-то’ ‘to somewhere’
jalˀir йал*ир ‘зовет (ее)’ ‘is calling (her)’
jiɢoloɢa=lo йигъологъа=ло ‘пока (она) придет, тоже’ ‘until (she) comes, too’
jiinnologu йииннологу ‘когда (она) уходит’ ‘while (she) is leaving’
jilˀinno йил*инно ‘(она) уходит’ ‘(she) is leaving’
k’ek’o=lo КIекIо=ло ‘Кеко (личное имя), тоже’ ‘Keko (proper name)’
k’otulˀa=jd кIотул*а=йд ‘на коне, мол’ ‘on a horse, they say’
k’otulˀa=lo кIотул*а=ло ‘на коне, тоже’ ‘on a horse, too’
kalas=lojd калас=лойд ‘класс’ ‘class(mates), PTCL’
klasilˀo класил*о ‘классу’ ‘to the class(mates)’
kodi=lo коди=ло ‘на руки, тоже’ ‘into the hands, too’
kulilɬku кулиллъку ‘из кошары’ ‘from the sheepfold’
kulillˀa кулилл*а ‘в кошаре’ ‘in the sheepfold’
kuli=lojd кули=лойд ‘кошара’ ‘sheepfold, PTCL’
kurt’alogu куртIалогу ‘с молотком’ ‘with a hammer’
kutakulˀa кутакул*а ‘сильно’ ‘very much’
kutukulˀa кутукул*а ‘очень сильно’ ‘very-very much’
lˀala л*ала ‘крышка’ ‘lid’
masala масала ‘пример’ ‘example’
matulˀaʁojd матул*агъойд ’в местности Матул*а’ ‘in Matula (toponym)’
matulˀo матул*о ’в местность Матул*а’ ‘to Matula (toponym)’
misalˀa мисал*а ‘на каком-то месте’ ‘somewhere’
misalˀakːu мисал*акку ‘из какого-то места’ ‘from somewhere’
mʲarulˀa мярул*а ‘в начале’ ‘at the beginning’
mʲarulˀo=lo мярул*о=ло ‘в начало, тоже’ ‘to the starting point’
musalaw мусалав ‘Мусалав (личное имя)’ ‘Musalav (personal name)’
musalawšːur мусалавшур ‘Мусалава (род.п., личное имя)’ ‘Musalav’s (personal name)’
nik’alajgu никIалайгу ‘в старину’ ‘in the old times’
oloqan олохъан ‘юноша’ ‘young man’
petizarʲadka=lojd петизарядка=лойд ‘пятизарядное ружье’ ‘five-barrel gun, PTCL’
položenija=lo положенийа=ло ‘положение, тоже’ ‘situation, too’
primerulˀaɬid примерул*алъид ‘на примере’ ‘by the example of, PTCL’
q’ali къали ‘канистра’ ‘jerrycan’
q’alidi къалиди ‘в канистру’ ‘into a jerrycan’
q’ali=lo къали=ло ‘канистра, тоже’ ‘jerrycan, too’
reɬolˀa=logu релъол*а=логу ‘находясь на озере’ ‘while at the lake’
rejdi=lojd рейди=лойд ‘на улицу’ ‘outside, PTCL’
relˀa рел*а ‘рука’ ‘hand’
rešinolˀakːu решинол*акку ‘с неба’ ‘from the sky’
rihisːula ригьиссула ‘под утро’ ‘in the morning’
rok’ollˀo=lojd рокIолл*о=лойд ‘в памяти (букв. в сердце)’ ‘in the memory (lit. in the heart), PTCL’
rolˀal рол*ал ‘одежда’ ‘clothes’
roq’orallo=logu рокъоралло=логу ‘примиряя’ ‘while reconciling’
rulˀond=lo рул*онд=ло ‘ушло, тоже’ ‘(it) was gone, too’
šːela щела ‘завтра’ ‘tomorrow’
sːori=lo ссори=ло ‘повернулся, тоже’ ‘turned, too’
žirado=lo=sːu=low жирадо=ло=ссу=лов ‘делает же, нет?’ ‘does, doesn’t he?’
sːuratulˀa ссуратул*а ‘на фотографии’ ‘on a photo’
sebgulo себгуло ‘ничего’ ‘nothing’
silalɬbo силаллъбо ‘для той силы’ ‘to the force’
soloman Соломан ‘Соломан (личное имя)’ ‘Soloman (proper name)’
soru=lo сору=ло ‘вместе, тоже’ ‘together, too’
t’ebt’elol=lo тIебтIелол=ло ‘кизяк, тоже’ ‘dried dung, too’
t’ulugu тIулугу ‘сильно’ ‘strongly’
talulˀa=lo талул*а=ло ‘на травянистом месте, тоже’ ‘on a grassy place, too’
tawsːu=lo Тавссу=ло ‘Тавссу (личное имя), тоже’ ‘Tavssu (proper name), too’
udob=lo=lˀa удоб=ло=л*а ‘то-се’ ‘this and that’
unsa=lo унса=ло ‘теплый, тоже’ ‘warm, too’
uškula ушкула ‘в школе’ ‘at school’
ust’ululˀa устIулул*а ‘на столе’ ‘on a table’
woχudu=lojd вохуду=лойд ‘приехал’ ‘(he) came, PTCL’
woinno=lo воинно=ло ‘ходил, тоже’ ‘went, too’
wok’o=lˀa вокIо=л*а ‘были же’ ‘there were, weren’t there’
wolˀinnu вол*инну ‘идти’ ‘go’
wolˀon вол*он ‘ушли’ ‘(men) left’
wolˀond вол*онд ‘ушли’ ‘(men) have left’
wolˀondil вол*ондил ‘ушли, оказывается’ ‘apparently, (men) left’
wolˀondil=lo вол*ондил=ло ‘ушли, оказывается, тоже’ ‘apparently, (men) left, too’
wolˀond=lo вол*онд=ло ‘ушли, тоже’ ‘(men) left, too’
woq’du=lo вокъду=ло ‘прийти, тоже’ ‘arrive, too’
worč’unni=lˀa ворчIунни=л*а ‘спаслись же’ ‘(men) survived, didn’t they’
wstrečallilˀo встречаллил*о ‘на встречи’ ‘to meetings’
wuč’orado=logu вучIорадо=логу ‘вставая’ ‘when standing up’
wuinno=logu вуинно=логу ‘уходя’ ‘when leaving’
wulˀom вул*ом ‘уходи’ ‘leave!’
wulˀon вул*он ‘ушел’ ‘(he) left’
wulˀond вул*онд ‘ушел’ ‘(he) has left’
wulˀond=id вул*онд=ид ‘что он пошел, мол’ ‘(he) has left, they say’
wulˀond=lo вул*онд=ло ‘уйдя, тоже’ ‘having left, too’
žibgu=lo жибгу=ло ‘и само, тоже’ ‘itself, too’
židu=lo жиду=ло ‘сделать, тоже’ ‘do, too’
žilˀid жил*ид ‘хочет’ ‘wants’
žirado=lo жирадо=ло ‘делается, тоже’ ‘is being done, too’
zolo золо ‘очень’ ‘very’
zologu зологу ‘слишком’ ‘too much’

Appendix 2. Pulse and intensity profiles

Appendix 3. Effect plots for F45 and M69 mixed effects models

Fig. 21. Effect plot for the longest interval between glottal pulses in a lateral

Fig. 22. Effect plot for normalized intensity of a lateral

Fig. 23. Effect plot for duration of a lateral

Fig. 24. Effect plot for shimmer

Fig. 25. Effect plot for H2-H1 tilt (only speaker F45)

Fig. 26. Effect plot for A1-H1 tilt (only speaker F45)

Fig. 27. Effect plot for A2-H1 tilt (only speaker F45)

Appendix 4. Analysis of stres

Appendix 5. Creak spread

Table 2. Creak statistics

speaker prodType_norm consonant no creak creaky full stop right creak spread left creak spread
F30 Individual words l 9 NA NA NA NA
F30 Individual words 9 NA NA NA NA
F30 Carrier phrase l 3 NA NA NA NA
F30 Carrier phrase 3 NA NA NA NA
F45 Individual words l 9 NA NA NA NA
F45 Individual words NA 9 NA 3 NA
F45 Carrier phrase l 3 NA NA NA NA
F45 Carrier phrase 2 1 NA NA NA
F45 Free narrative l 29 NA NA NA NA
F45 Free narrative 4 8 1 4 NA
F49 Individual words l 9 NA NA NA NA
F49 Individual words NA 8 1 7 NA
F49 Carrier phrase l 3 NA NA NA NA
F49 Carrier phrase NA 2 1 3 NA
M35 Free narrative l 19 NA NA NA NA
M35 Free narrative 9 11 1 NA NA
M40 Free narrative l 27 NA NA NA NA
M40 Free narrative 17 4 NA NA NA
M50 Individual words l 9 NA NA NA NA
M50 Individual words NA 3 6 NA 1
M50 Carrier phrase l 3 NA NA NA NA
M50 Carrier phrase NA 3 NA NA 1
M52 Individual words l 9 NA NA NA NA
M52 Individual words 1 7 1 4 NA
M52 Carrier phrase l 3 NA NA NA NA
M52 Carrier phrase 2 NA 1 NA NA
M60 Individual words l 9 NA NA NA NA
M60 Individual words NA 9 NA 5 NA
M60 Carrier phrase l 3 NA NA NA NA
M60 Carrier phrase NA 3 NA 2 NA
M69 Individual words l 9 NA NA NA NA
M69 Individual words NA 2 7 NA NA
M69 Carrier phrase l 3 NA NA NA NA
M69 Carrier phrase NA 1 2 NA NA
M69 Free narrative l 28 NA NA NA NA
M69 Free narrative 10 19 NA 1 NA
M75 Free narrative l 12 NA NA NA NA
M75 Free narrative 9 9 NA 2 NA

Appendix 6. Spectral tilt dynamics

Appendix 7. Praat script

Script for extracting sound data

 # the script extracts data for each token of a lateral

form Data extracton parameters
 # sound, word, production type (token), speaker - interval tiers
 # pulse - point tier
 comment Number of the sound tier
 integer sndTier 1
 comment Number of the word tier
 integer wrdTier 2
 comment Number of the production type tier
 integer prodTypeTier 3
 comment Number of the speaker tier
 integer spkTier 6
 comment Pulse tier
 integer plsTier 7
 comment Creak type tier
 integer creakTier 8
 comment Path to formant extraction data
 text formantFile _ Formant_Extraction_Parameters.txt
 comment Path to save spectrograms
 text path C:\Users\ashir\Desktop\_l_Spectrograms\
endform

sound_data_raw = selected ("Sound")
textGrid_data = selected ("TextGrid")

Edit

 # ---- delete the initial word "Sound " from the file name
select sound_data_raw
inpFile$ = selected$ ()
len = length: inpFile$
inpFile$ = right$: inpFile$, len - 6

 # ---- make output file names
outFile$ = inpFile$ + "_Sound_data.txt"

 # ---- resample the sound

select sound_data_raw
Resample... 16000 50
sound_data = selected("Sound")

 # ---- scaling parameters

pctRightBase = 10 ; base width of a spectrogram in Praat picture
pctRightScale = 0.5 ; base duration of a word for scaling, seconds
pctRight = 0

 # ---- variables

fCounter = 0 ; counter for formants
tokenCounter = 1 ; will be used as a key for the tokens
spectrogramFlag = 0
tmpSound = 0


select textGrid_data
nIntervals = Get number of intervals: sndTier ; number of intervals in the sounds tier

 # ---- get formant extraction parameters

str = Read Strings from raw text file... 'formantFile$'

select str
strNum = Get number of strings

fParams$ [1] = "" ; array of formant extraction parameters

if strNum > 1
 for i from 1 to strNum
  fParams$ [i] = Get string: i
 endfor
endif

removeObject: str

 # ---- create intensity object 

selectObject: sound_data
intensity = To Intensity... 100 0

 # ---- make headers

writeFileLine: outFile$, "file", tab$, "token_code", tab$, "speaker", tab$, "word", tab$, "prodType", tab$, "v1", tab$, "v2", tab$, "consonant", tab$,
                   ..."creakType", tab$, "creakStart", tab$, "creakEnd", tab$, "V1start", tab$, "Cstart", tab$, "V2start", tab$, "V2end", tab$,
                   ..."v1_max_int", tab$, "c_min_int", tab$, "v2_max_int", tab$,
                   ..."c_mean_int", tab$, "c_mean_int_norm", tab$,
                   ..."left_point", tab$, "f0_left_hz", tab$, "f0_left_db", tab$, "h2_left_hz", tab$, "h2_left_db", tab$, "a1_left_hz", tab$, "a1_left_db", tab$, "a2_left_hz", tab$, "a2_left_db", tab$,
                   ..."mid_point", tab$, "f0_mid_hz", tab$, "f0_mid_db", tab$, "h2_mid_hz", tab$, "h2_mid_db", tab$, "a1_mid_hz", tab$, "a1_mid_db", tab$, "a2_mid_hz", tab$, "a2_mid_db", tab$,
                   ..."right_point", tab$, "f0_right_hz", tab$, "f0_right_db", tab$, "h2_right_hz", tab$, "h2_right_db", tab$, "a1_right_hz", tab$, "a1_right_db", tab$, "a2_right_hz", tab$, "a2_right_db"

 # ---- the main algorythm

writeInfo: ""

for i from 2 to (nIntervals - 1)

 # -- find sounds in the sound tier
 selectObject: textGrid_data

 snd1$ = Get label of interval: sndTier, i - 1 ; previous sound
 snd2$ = Get label of interval: sndTier, i     ; current sound
 snd3$ = Get label of interval: sndTier, i + 1 ; next sound

 # limits of the previous sound
 snd1Lft = Get start point: sndTier, i - 1 ; the left point of the interval
 snd1Rght = Get end point: sndTier, i - 1 ; the right point of the interval

 # limits of the current sound
 snd2Lft = Get start point: sndTier, i
 snd2Rght = Get end point: sndTier, i

 # limits of the next sound
 snd3Lft = Get start point: sndTier, i + 1
 snd3Rght = Get end point: sndTier, i + 1
    
 # -- check that the sounds are in the same word
 wrdLft = Get interval at time: wrdTier, (snd1Lft + snd2Lft) / 2
 wrdLft$ = Get label of interval: wrdTier, wrdLft
 wrdRght = Get interval at time: wrdTier, (snd3Lft + snd3Rght) / 2
 wrdRght$ = Get label of interval: wrdTier, wrdRght

 # save the spectrogram

 if spectrogramFlag = 1 and wrdRght$ <> wrdLft$
  Select outer viewport: 0, pctRight, 0, 7
  fname$ = path$ + inpFile$ + "_" + string$(tokenCounter) + "_" + wrdLft$ + "_" + spk$ + "_" + prodType$ + ".png"
  Save as 300-dpi PNG file: fname$

  removeObject: tmpTxtGrid
  removeObject: tmpSound

  spectrogramFlag = 0
  tmpSound = 0
 endif

 # -- normalize sound notation
 if snd2$ = "l'"
  snd2$ = "lˀ"
 endif

 # -- check whether the lateral is between 2 sounds and that they all are within one word
 # -- then extract all the necessary data

 if (snd2$ = "l" or snd2$ = "lˀ") and snd1$ <> "" and snd3$ <> "" and wrdLft$ = wrdRght$ and
 ...((length (snd1$) = 1 and length (snd3$) = 1) or 
 ...(left$(snd3$,1) = "^" and length (snd1$) = 1) or
 ...(left$(snd1$,1) = "^" and length (snd3$) = 1))

  spectrogramFlag = 1
  wrdBorderLft = Get start point: wrdTier, wrdLft
  wrdBorderRght = Get end point: wrdTier, wrdLft

  # -- drafting the spectrogram

  # extract the sound and textgrid

  if tmpSound = 0 ; this is the first encounter of V_V
   select sound_data
   Extract part: wrdBorderLft, wrdBorderRght, "rectangular", 1, "no"
   tmpSound = selected("Sound")
  
   select textGrid_data
   Extract part: wrdBorderLft, wrdBorderRght, "no"
   tmpTxtGrid = selected ("TextGrid")

   nPulses = Get number of points: plsTier
   z = 1
   while z <= nPulses
    t = Get time of point: plsTier, z
    if (t < snd1Lft - wrdBorderLft) or (t > snd3Rght - wrdBorderRght)
     Remove point: plsTier, z
     nPulses = Get number of points: plsTier
    else
     z = z + 1
    endif
   endwhile

   # remove the data that is not required
   numberOfTiers = Get number of tiers
   if numberOfTiers = 9
     Remove tier... 9
     Remove tier... 8
   endif
   Remove tier... 5
   Remove tier... 4

   # scaling
   pctRight = pctRightBase * (wrdBorderRght - wrdBorderLft) / pctRightScale

   # draw the spectrogram
   select tmpSound
   plus tmpTxtGrid
   Edit

   Select outer viewport: 0, pctRight, 4, 7
   editor: tmpTxtGrid
    Select: 0, wrdBorderRght - wrdBorderLft
    Draw visible sound and TextGrid: "yes", "no", "yes", "yes", "yes"
   endeditor

   Select outer viewport: 0, pctRight, 0, 4
   editor: tmpTxtGrid
    Select: 0, wrdBorderRght - wrdBorderLft
    # parameters: erase first, write name, draw selection times
    # draw selection hairs, garnish
    Paint visible spectrogram: "no", "no", "yes", "yes", "yes"
   endeditor
  endif

  # -- data extraction

  selectObject: textGrid_data

  prodType = Get interval at time: prodTypeTier, snd2Lft
  prodType$ = Get label of interval: prodTypeTier, prodType
  spk = Get interval at time: spkTier, snd2Lft
  spk$ = Get label of interval: spkTier, spk

  creakType_number = Get number of intervals: creakTier
  creakType = Get interval at time: creakTier, snd1Lft
  if creakType_number > 2 and creakType < creakType_number - 1
   creakType = creakType + 1 ; because we know there cannot be creak in the beginning of the first vowel
   creakStart = Get start point: creakTier, creakType
   creakEnd = Get end point: creakTier, creakType
   creakType$ = Get label of interval: creakTier, creakType
   if creakStart > snd3Rght or creakType$ = ""
    creakStart = 0
    creakEnd = 0
    creakType$ = "-"
   endif
  else
   # there's only one or two intervals in the tier
   creakStart = 0
   creakEnd = 0
   creakType$ = "-"
  endif

  appendFile: outFile$, inpFile$, tab$, tokenCounter, tab$, spk$, tab$, wrdLft$, tab$, prodType$, tab$, snd1$, tab$, snd3$, tab$, snd2$, tab$,
           ...creakType$, tab$, fixed$ (creakStart, 3), tab$, fixed$ (creakEnd, 3), tab$, fixed$ (snd1Lft, 3), tab$, fixed$ (snd2Lft, 3), tab$, fixed$ (snd3Lft, 3), tab$, fixed$ (snd3Rght,3), tab$

  selectObject: intensity
  snd1IntMax = Get maximum: snd1Lft, snd2Lft, "None"
  snd2IntMean = Get mean... snd2Lft snd3Lft dB
  snd2IntMin = Get minimum... snd2Lft snd3Lft None
  snd3IntMax = Get mean... snd3Lft snd3Rght dB

  # -- extract normalized intensity of the consonants

  snd2IntNorm = 0

  @extract_normalized_intensities: sound_data, snd2Lft, snd2Rght, snd3Rght, 70, snd2IntNorm

  appendFile: outFile$, fixed$ (snd1IntMax, 2), tab$, fixed$ (snd2IntMin, 2), tab$, fixed$ (snd3IntMax, 2), tab$,
                   ...fixed$ (snd2IntMean, 2), tab$, fixed$ (snd2IntNorm, 2), tab$

  # -- extract formant data

  if fCounter = 0
   fCounter = 1
   @split (" ", fParams$ [fCounter])
   while split.array$[1] <> inpFile$
    fCounter = fCounter + 1
    @split (" ", fParams$ [fCounter])
   endwhile
   #appendInfoLine: fCounter, tab$, wrdLft$
  else
   fCounter = fCounter + 1
   @split (" ", fParams$ [fCounter])
   appendInfoLine: fCounter, tab$, wrdLft$
  endif

  # estimate formant intensities, draw formants
  for k from 1 to 3
   tiltPlace$ = split.array$[(k-1)*7+2]
   a1_lft_hz$ = split.array$[(k-1)*7+3]
   a1_rght_hz = number (split.array$[(k-1)*7+4])
   a2_lft_hz = number (split.array$[(k-1)*7+5])
   a2_rght_hz = number (split.array$[(k-1)*7+6])
   a3_lft_hz = number (split.array$[(k-1)*7+7])
   a3_rght_hz = number (split.array$[(k-1)*7+8])

   if tiltPlace$ <> "-" and a1_lft_hz$ <> "-"
    tiltTime = snd2Lft + (snd2Rght - snd2Lft) * number(tiltPlace$)
    f0_hz = 0
    @estimate_f0_hz: sound_data, textGrid_data, plsTier, tiltTime, f0_hz
    h2_hz = f0_hz * 2
    a1_hz = 0
    a2_hz = 0
    f0_dB = 0
    h2_dB = 0
    a1_dB = 0
    a2_dB = 0
    if a1_lft_hz$ = "Auto"
     @extract_formants_no_bands: sound_data, tiltTime, f0_hz
     f0_hz = extract_formants_no_bands.f0_hz
     h2_hz = extract_formants_no_bands.h2_hz
     a1_hz = extract_formants_no_bands.a1_hz
     a2_hz = extract_formants_no_bands.a2_hz
     f0_dB = extract_formants_no_bands.f0_dB
     h2_dB = extract_formants_no_bands.h2_dB
     a1_dB = extract_formants_no_bands.a1_dB
     a2_dB = extract_formants_no_bands.a2_dB
    else
     @extract_formants_with_bands: sound_data, tiltTime, number(a1_lft_hz$), a1_rght_hz, a2_lft_hz, a2_rght_hz, f0_hz
     f0_hz = extract_formants_with_bands.f0_hz
     h2_hz = extract_formants_with_bands.h2_hz
     a1_hz = extract_formants_with_bands.a1_hz
     a2_hz = extract_formants_with_bands.a2_hz
     f0_dB = extract_formants_with_bands.f0_dB
     h2_dB = extract_formants_with_bands.h2_dB
     a1_dB = extract_formants_with_bands.a1_dB
     a2_dB = extract_formants_with_bands.a2_dB
    endif
    @draw_formants: f0_hz, h2_hz, a1_hz, a2_hz, (tiltTime - wrdBorderLft)
    appendFile: outFile$, tiltPlace$, tab$, fixed$ (f0_hz, 2), tab$, fixed$ (f0_dB, 2), tab$, fixed$ (h2_hz, 2), tab$, fixed$ (h2_dB, 2), tab$, fixed$ (a1_hz, 2), tab$, fixed$ (a1_dB, 2), tab$, fixed$ (a2_hz, 2), tab$, fixed$ (a2_dB, 2)
   else
    appendFile: outFile$, "-", tab$, "-", tab$, "-", tab$, "-", tab$, "-", tab$, "-", tab$, "-", tab$, "-", tab$, "-"
   endif
   if k < 3
    appendFile: outFile$, tab$
   endif
  endfor
  appendFileLine: outFile$
  tokenCounter = tokenCounter + 1
 endif
endfor

if spectrogramFlag = 1 and wrdRght$ <> wrdLft$
 Select outer viewport: 0, pctRight, 0, 7
 fname$ = inpFile$ + "_" + string$(tokenCounter) + "_" + wrdLft + "_" + spk$ + "_" + prodType$ + ".png"
 Save as 300-dpi PNG file: fname$
 spectrogramFlag = 0
# removeObject: tmpTxtGrid
# removeObject: tmpSound
endif

removeObject: intensity
removeObject: sound_data

selectObject: sound_data_raw, textGrid_data

appendInfoLine: "Done!"

# .sep$ - separator, .str$ the string to be separated
procedure split (.sep$, .str$)
    .strlen = length (.str$)
    .sep = index (.str$, .sep$)
    .seplen = length (.sep$)
    .length = 1
    while .sep > 0
        .part$ = left$ (.str$, .sep - 1)
        .str$ = right$ (.str$, length (.str$) - .sep - .seplen + 1)
        .sep = index (.str$, .sep$)
        .array$ [.length] = .part$
        .length = .length + 1
    endwhile
    .array$ [.length] = .str$
endproc

procedure extract_normalized_intensities: .sound_data, .snd2Lft, .snd2Rght, .snd3Rght, .norm_dB, snd2IntNorm
 select .sound_data
 Extract part: .snd2Lft - 1, .snd3Rght + 1, "rectangular", 1, "yes"
 .tmpSound = selected ("Sound")
 .tmpIntensity = To Intensity... 100 0
 .snd3Int = Get mean... .snd2Rght .snd3Rght dB
 .snd2Int = Get mean... .snd2Lft .snd2Rght dB
 .snd2snd3Int = Get mean... .snd2Lft .snd3Rght dB
 removeObject: .tmpIntensity

 .snd3IntNorm = .norm_dB
 snd2IntNorm = .snd2Int + (.snd3IntNorm - .snd3Int)
 .snd2snd3IntNorm = .snd2snd3Int + (.snd3IntNorm - .snd3Int)

 .loopFlag = 1
 while .loopFlag = 1
  selectObject: .tmpSound
  Scale intensity... .snd2snd3IntNorm
  .tmpIntensity = To Intensity... 100 0

  snd2IntNorm = Get mean... .snd2Lft .snd2Rght dB
  .snd3IntNorm = Get mean... .snd2Rght .snd3Rght dB
  if .snd3IntNorm < 69.5
   .snd2snd3IntNorm = .snd2snd3IntNorm + 1
  endif
  if .snd3IntNorm > 70.5
   .snd2snd3IntNorm = .snd2snd3IntNorm - 1
  endif
  if .snd3IntNorm >= 69.5 and .snd3IntNorm <= 70.5
   .loopFlag = 0
  endif
  removeObject: .tmpIntensity
 endwhile
 removeObject: .tmpSound
endproc

procedure estimate_f0_hz: .sound_data, .textGrid_data, .pulseTier, .tiltPlace, f0_hz
# if pulse interval is greater than 0.02, f0 is undefined
 select .textGrid_data
 .pulse_start_id = 1
 .pulseTime = Get time of point: .pulseTier, .pulse_start_id
 while .pulseTime < .tiltPlace
  .pulse_start_id = .pulse_start_id + 1
  .pulseTime = Get time of point: .pulseTier, .pulse_start_id
 endwhile
 .pulseTime_prev = Get time of point: .pulseTier, (.pulse_start_id - 1)
 if (.pulseTime - .pulseTime_prev) > 0.02
  f0_hz = undefined
 else
  f0_hz = 1 / (.pulseTime - .pulseTime_prev)
 endif
endproc

procedure extract_formants_with_bands: .sound_data, .tiltTime, .a1_left_hz, .a1_right_hz, .a2_left_hz, .a2_right_hz, .f0_hz
 select .sound_data
 Edit
 editor: .sound_data
  Move cursor to: .tiltTime
  View spectral slice
 Close
 .sliceID = selected ("Spectrum")
 .ltasID = To Ltas (1-to-1)

 if .f0_hz <> undefined
  .f0_dB = Get maximum: (.f0_hz * 0.9), (.f0_hz * 1.1), "None"
  .f0_hz = Get frequency of maximum: (.f0_hz * 0.9), (.f0_hz * 1.1), "None"

  .h2_hz = f0_hz * 2
  .h2_dB = Get maximum: (.h2_hz * 0.9), (.h2_hz * 1.1), "None"
 else
  .f0_dB = undefined
  .h2_hz = undefined
  .h2_dB = undefined
 endif

 .a1_dB = Get maximum: .a1_left_hz, .a1_right_hz, "None"
 .a1_hz = Get frequency of maximum: .a1_left_hz, .a1_right_hz, "None"

 .a2_dB = Get maximum: .a2_left_hz, .a2_right_hz, "None"
 .a2_hz = Get frequency of maximum: .a2_left_hz, .a2_right_hz, "None"

 removeObject: .sliceID
 removeObject: .ltasID
endproc

procedure extract_formants_no_bands: .sound_data, .tiltTime, .f0_hz
 select .sound_data
 Edit
 editor: .sound_data
  Move cursor to: .tiltTime
  View spectral slice
 Close
 .sliceID = selected ("Spectrum")
 .ltasID = To Ltas (1-to-1)

 select .sound_data
 Edit
 editor: .sound_data
  Select: (.tiltTime - 0.1), (.tiltTime + 0.1)
  Extract selected sound (preserve times)
 Close
 .tmpSoundID = selected ("Sound")
 .formantID = To Formant (burg)... 0.0025 5 5900 0.025 50
 .a1_hz = Get quantile: 1, (.tiltTime - 0.05), (.tiltTime + 0.05), "Hertz", 0.5
 .a2_hz = Get quantile: 2, (.tiltTime - 0.05), (.tiltTime + 0.05), "Hertz", 0.5

 select .ltasID 

 if .f0_hz = undefined
  .f0_dB = undefined
  .h2_hz = undefined
  .h2_dB = undefined
 else
  .f0_dB = Get maximum: (.f0_hz * 0.9), (.f0_hz * 1.1), "None"
  .f0_hz = Get frequency of maximum: (.f0_hz * 0.9), (.f0_hz * 1.1), "None"

  .h2_hz = .f0_hz * 2
  .h2_dB = Get maximum: (.h2_hz * 0.9), (.h2_hz * 1.1), "None"
 endif

 if .a1_hz = undefined
  .a1_dB = undefined
 else
  .a1_dB = Get maximum: (.a1_hz * 0.9), (.a1_hz * 1.1), "None"
  .a1_hz = Get frequency of maximum: (.a1_hz * 0.9), (.a1_hz * 1.1), "None"
 endif

 if .a2_hz = undefined
  .a2_dB = undefined
 else
  .a2_dB = Get maximum: (.a2_hz * 0.9), (.a2_hz * 1.1), "None"
  .a2_hz = Get frequency of maximum: (.a2_hz * 0.9), (.a2_hz * 1.1), "None"
 endif

 removeObject: .tmpSoundID
 removeObject: .sliceID
 removeObject: .ltasID
 removeObject: .formantID
endproc

procedure draw_formants: .f0_hz, .h2_hz, .a1_hz, .a2_hz, .place
 if .a1_hz <> undefined   
  One mark left: .a1_hz, "yes", "yes", "yes", ""
  Paint circle: "red", .place, .a1_hz, 0.002
 endif
 if .a2_hz <> undefined   
  One mark left: .a2_hz, "yes", "yes", "yes", ""
  Paint circle: "red", .place, .a2_hz, 0.002
 endif
endproc